package com.castle.fortress.admin.flowable.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.castle.fortress.admin.flowable.dto.FlowableTemplateDto;
import com.castle.fortress.admin.flowable.dto.ProcessDto;
import com.castle.fortress.admin.form.dto.FormDataDto;
import com.castle.fortress.admin.system.entity.SysUser;
import com.castle.fortress.common.entity.RespBody;

import java.util.List;
import java.util.Map;

/**
 * 流程管理 服务类
 * @author castle
 */
public interface FlowableManageService {
    /**
     * 部署流程
     * @param actKey
     * @return
     */
    RespBody<Map<String,String>> deploy(String actKey);

    /**
     * 发起审批流程
     * @param processDto
     * @return
     */
    RespBody<String> runProcess(ProcessDto processDto,SysUser user);

    /**
     * 发起审批流程
     * @param tbId
     * @return
     */
    RespBody<String> runProcess(Long tbId, Map<String,Object> formData,SysUser user);

    /**
     * 未完成的任务列表
     * @param page
     * @param user
     * @return
     */
    IPage<Map<String, Object>> myTasks(Page<FlowableTemplateDto> page, SysUser user,Map<String,String> params);

    /**
     * 待办任务列表
     * @param page
     * @param user
     * @param params
     * @return
     */
    IPage<Map<String,Object>> todoTasks(Page<FlowableTemplateDto> page, SysUser user,Map<String,String> params);

    /**
     * 完成审批
     * @param user
     * @param params
     * @return
     */
    String completeTask(SysUser user,Map<String,String> params);
    /**
     * 历史节点
     * @param user
     * @param params
     * @return
     */
    List<Map<String,Object>> historyNodes(SysUser user,Map<String,String> params);

    /**
     * 已完成任务列表
     * @param page
     * @param user
     * @param params
     * @return
     */
    IPage<Map<String, Object>> finishTasks(Page<FlowableTemplateDto> page, SysUser user, Map<String, String> params);

    /**
     * 流程所有参与人
     * @param user
     * @param params
     * @return
     */
    List<Map<String, Object>> allParticipants(SysUser user, Map<String, String> params);

    /**
     *取消任务
     * @param user
     * @param params
     * @return
     */
    String cancelTask(SysUser user, Map<String, String> params);

    /**
     * 审批拒绝时结束流程
     * @param processId 流程实例ID
     * @param tbId
     * @param id
     * @param approveStatus 状态 为空则保留原状态 否则置成 结束状态
     * @return
     */
    String endProcess(String processId,String tbId,String id,String approveStatus);

    /**
     * 返回到上一个审批节点 无可退节点则结束流程
     * @param processId
     * @param taskKey
     * @param executionId
     * @param tbId
     * @param id
     * @return
     */
    String backToPreUserTask(String processId,String taskKey,String executionId,String tbId,String id);

    /**
     * 初始化流程变量
     * @param user
     * @param variables
     * @param formDataDto
     */
    void initFlowableVariables(SysUser user, Map<String,Object> variables, FormDataDto formDataDto);

    /**
     * 审批人自选抄送人
     * @param user
     * @param params
     * @return
     */
    Map<String, Object> csOptional(SysUser user, Map<String, String> params);
    /**
     * 抄送我任务列表
     * @param page
     * @param user
     * @param params
     * @return
     */
    IPage<Map<String, Object>> csToMe(Page<FlowableTemplateDto> page, SysUser user, Map<String, String> params);

    /**
     * 委派任务（前加签、后加签）
     * @param user
     * @param params
     * @return
     */
    String delegateTask(SysUser user, Map<String, String> params);

    /**
     * 转办任务（只能转办一人）
     * @param user
     * @param params
     * @return
     */
    String turnTask(SysUser user, Map<String, String> params);

    /**
     * 获取所有可退回的节点
     * @param user
     * @param params
     * @return
     */
    List<Map<String, Object>> getAllBackNodes(SysUser user, Map<String, String> params);

    /**
     * 退回到指定节点
     * @param user
     * @param params
     * @return
     */
    String backToNode(SysUser user, Map<String, String> params);

    /**
     * 查询指定节点的回退方式
     * @param user
     * @param params
     * @return
     */
    String refuseBackInfo(SysUser user, Map<String, String> params);
}
